const express = require('express')


const app = express()

// 导入jwt相关的两个包
const jwt=require('jsonwebtoken')
const expressJWT=require('express-jwt')

app.use(express.json())
app.use(express.urlencoded({extended: false}))

// 定义secret密钥
const secretKey="itgeima No1 (*^_^*)"

// 注册将jwt字符串解析还原成json对象的中间件
// 只要配置成功了express-jwt这个中间件，就可以把解析出来的用户信息挂载到req.user属性上
app.use(expressJWT({secret:secretKey}).unless({path:[/^\/api\//]}))


// 登录
app.post('/api/login',(req,res)=>{
    const userinfo=req.body
    if(userinfo.username!='admin'||userinfo.password!='000'){
        return res.send({status:1,msg:"登录失败"})
    }

    // 登录成功，调用jwt.sign()方法生成jwt字符串，并通过token属性发生给客户端
    // 参数：1.用户的信息对象，2.加密的密钥，3.配置对象，可以配置token的有效期
   //  注意不要把隐私加密到token中
   const token= jwt.sign({username:userinfo.username},secretKey,{expiresIn:'100s'})



    res.send({status:0,msg:"登录成功",token:token})
})

// 有权限的api
app.get('/admin/getinfo',(req,res)=>{

    // 使用req.user获取用户信息
   console.log(req.user)
    res.send({
        status:200,
        msg:"获取用户信息成功",
        data:req.user
    })
})

// 全局中间件捕获jwt解析失败后的错误
app.use((err,req,res,next)=>{
    if(err.name==='UnauthorizedError'){
        return res.send({
            status:201,
            msg:"无效token"
        })
    }
    return res.send({
        status:500,
        msg:'未知错误'
    })
})


app.listen(80, () => {
    console.log("server is running")
})